# !/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
@作者 杨阳
@时间 2018-06-21
@说明 定义json转换的一些规则
@注意事项
"""
import json
from datetime import date

from apscheduler.triggers.cron import CronTrigger
from sqlalchemy.orm.state import InstanceState


class JsonEncoder(json.JSONEncoder):

    def default(self, obj):
        """
        将pythone对象化为json时，处理掉一些不能转换的类
        :param obj:
        :return:
        """
        if isinstance(obj, CronTrigger):
            return obj.__str__()
        if isinstance(obj, InstanceState):
            return obj.__str__()
        elif isinstance(obj, date):
            return obj.__str__()
        elif isinstance(obj, bytes):
            return obj.__str__()
        elif isinstance(obj, type):
            return obj.__str__()
        return json.JSONEncoder.default(self, obj)


def classToDict(obj):
    """
    将python对象转换为字典
    要点：
    1. 当将一个对象转换成dict的时候，他会去调用keys函数
    2. keys 方法的目的就是为了拿到字典里所有的键，至于说这些键有那么，完全有我们自己来定义。
        keys 返回的必须是一个元组或者列表来声明要序列化的键。
        示例：
        def keys(self):
            return ('name', 'age', 'gender')
    3. 而dict会以中括号的形式来拿到对应的值，如o["name"]，但是默认是不能这么访问的，我们需要编写__getitem__函数
        示例：
        def __getitem__(self, item):
            return getattr(self, item)
    :param obj:
    :return:
    """
    is_list = obj.__class__ == [].__class__
    is_set = obj.__class__ == set().__class__

    if is_list or is_set:
        obj_arr = []
        for o in obj:
            dict = {}
            dict.update(o.__dict__)
            obj_arr.append(dict)
        return obj_arr
    else:
        dict = {}
        if obj:
            dict.update(obj.__dict__)
        return dict
